/**
 * 登录辅助工具
 * 提供页面登录状态检查和处理
 */

const auth = require('./auth.js')

/**
 * 页面登录状态检查器
 * 用于在页面中快速检查和处理登录状态
 */
class LoginChecker {
  constructor(pageInstance) {
    this.page = pageInstance
    this.isChecking = false
  }

  /**
   * 检查登录状态并更新页面数据
   * @param {Object} options 选项
   * @returns {Promise<boolean>} 是否已登录
   */
  async checkLoginStatus(options = {}) {
    if (this.isChecking) {
      return false
    }

    this.isChecking = true

    try {
      const {
        showLoading = false,
        autoLogin = true,
        onSuccess,
        onFailure
      } = options

      if (showLoading) {
        wx.showLoading({ title: '检查登录状态...', mask: true })
      }

      const loginStatus = await auth.checkLoginStatus()
      
      // 更新页面数据
      this.updatePageData(loginStatus)

      if (loginStatus.isLoggedIn) {
        // 已登录
        if (onSuccess) {
          onSuccess(loginStatus.userInfo)
        }
        return true
      } else {
        // 未登录
        if (autoLogin) {
          // 尝试自动登录
          return await this.autoLogin(options)
        } else {
          if (onFailure) {
            onFailure(loginStatus.message)
          }
          return false
        }
      }

    } catch (error) {
      console.error('检查登录状态失败:', error)
      
      // 更新页面数据为未登录状态
      this.updatePageData({
        isLoggedIn: false,
        userInfo: null,
        message: '检查登录状态失败'
      })

      if (options.onFailure) {
        options.onFailure('检查登录状态失败')
      }
      
      return false
    } finally {
      this.isChecking = false
      if (options.showLoading) {
        wx.hideLoading()
      }
    }
  }

  /**
   * 自动登录
   * @param {Object} options 选项
   * @returns {Promise<boolean>} 是否登录成功
   */
  async autoLogin(options = {}) {
    try {
      const loginResult = await auth.login()
      
      if (loginResult.success) {
        // 登录成功
        this.updatePageData({
          isLoggedIn: true,
          userInfo: loginResult.userInfo,
          message: '登录成功'
        })

        if (options.onSuccess) {
          options.onSuccess(loginResult.userInfo)
        }

        return true
      } else {
        // 登录失败
        this.updatePageData({
          isLoggedIn: false,
          userInfo: null,
          message: loginResult.message
        })

        if (options.onFailure) {
          options.onFailure(loginResult.message)
        }

        return false
      }
    } catch (error) {
      console.error('自动登录失败:', error)
      
      this.updatePageData({
        isLoggedIn: false,
        userInfo: null,
        message: '自动登录失败'
      })

      if (options.onFailure) {
        options.onFailure('自动登录失败')
      }

      return false
    }
  }

  /**
   * 更新页面数据
   * @param {Object} loginStatus 登录状态
   */
  updatePageData(loginStatus) {
    if (this.page && this.page.setData) {
      this.page.setData({
        isLoggedIn: loginStatus.isLoggedIn,
        userInfo: loginStatus.userInfo,
        loginReady: true
      })
    }
  }

  /**
   * 处理自动登录完成回调
   * @param {boolean} isLoggedIn 是否已登录
   * @param {Object} userInfo 用户信息
   */
  onAutoLoginComplete(isLoggedIn, userInfo) {
    console.log('页面收到自动登录完成通知:', { isLoggedIn, userInfo })
    
    this.updatePageData({
      isLoggedIn: isLoggedIn,
      userInfo: userInfo,
      message: isLoggedIn ? '自动登录成功' : '自动登录失败'
    })
  }

  /**
   * 检查是否需要登录
   * @param {Function} onNeedLogin 需要登录时的回调
   * @returns {Promise<boolean>} 是否已登录
   */
  async requireLogin(onNeedLogin) {
    const isLoggedIn = await this.checkLoginStatus({
      autoLogin: false,
      onFailure: (message) => {
        if (onNeedLogin) {
          onNeedLogin(message)
        } else {
          wx.showToast({
            title: '请先登录',
            icon: 'none'
          })
        }
      }
    })

    return isLoggedIn
  }
}

/**
 * 创建页面登录检查器
 * @param {Object} pageInstance 页面实例
 * @returns {LoginChecker} 登录检查器实例
 */
const createLoginChecker = (pageInstance) => {
  return new LoginChecker(pageInstance)
}

/**
 * 页面登录状态混入
 * 可以混入到页面中，提供登录状态管理
 */
const loginMixin = {
  data: {
    isLoggedIn: false,
    userInfo: null,
    loginReady: false
  },

  onLoad(options) {
    // 创建登录检查器
    this.loginChecker = createLoginChecker(this)
    
    // 检查登录状态
    this.checkLoginStatus()
  },

  onShow() {
    // 页面显示时检查登录状态
    if (this.data.loginReady) {
      this.checkLoginStatus()
    }
  },

  /**
   * 检查登录状态
   */
  async checkLoginStatus() {
    if (this.loginChecker) {
      await this.loginChecker.checkLoginStatus()
    }
  },

  /**
   * 自动登录完成回调
   */
  onAutoLoginComplete(isLoggedIn, userInfo) {
    if (this.loginChecker) {
      this.loginChecker.onAutoLoginComplete(isLoggedIn, userInfo)
    }
  },

  /**
   * 检查是否需要登录
   */
  async requireLogin(onNeedLogin) {
    if (this.loginChecker) {
      return await this.loginChecker.requireLogin(onNeedLogin)
    }
    return false
  }
}

module.exports = {
  LoginChecker,
  createLoginChecker,
  loginMixin
} 